package com.liliudong.cursormate.service.impl;

import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.liliudong.cursormate.common.constant.SecurityConst;
import com.liliudong.cursormate.common.exception.BusinessException;
import com.liliudong.cursormate.entity.SysOrg;
import com.liliudong.cursormate.mapper.SysOrgMapper;
import com.liliudong.cursormate.service.SysOrgService;
import org.springframework.stereotype.Service;

import java.util.Objects;

/**
 * @author Liudong.li
 * @description 针对表【sys_org(系统组织表)】的数据库操作Service实现
 * @createDate 2023-10-24 22:29:24
 */
@Service
public class SysOrgServiceImpl extends ServiceImpl<SysOrgMapper, SysOrg>
        implements SysOrgService {

    @Override
    public void create(SysOrg sysOrg) {
        String orgNo = generateOrgNo(sysOrg.getParentOrgNo());
        sysOrg.setOrgNo(orgNo);
        if (StrUtil.isBlank(sysOrg.getParentOrgNo())) {
            // 父组织编码为空，则默认为顶级组织
            sysOrg.setParentOrgNo(SecurityConst.SUPER_ADMIN_ORG_CODE);
        }
        this.save(sysOrg);
    }

    /**
     * 生成组织编号
     *
     * @param parentOrgNo 上级组织编号
     * @return {@link String}
     */
    private String generateOrgNo(String parentOrgNo) {
        if (StrUtil.isEmpty(parentOrgNo)) {
            // 如果是顶级组织，则父组织编码为空，默认父组织为 000
            SysOrg sysOrg = baseMapper.selectOne(
                    Wrappers.lambdaQuery(SysOrg.class)
                            .select(SysOrg::getOrgNo)
                            .orderByDesc(SysOrg::getOrgNo)
                            .eq(SysOrg::getParentOrgNo, SecurityConst.SUPER_ADMIN_ORG_CODE)
                            .last("limit 1")
            );
            if (Objects.isNull(sysOrg)) {
                return "001";
            }
            String orgNo = sysOrg.getOrgNo();
            int currentMax = Integer.parseInt(orgNo);
            int nextNo = currentMax + 1;
            return String.format("%03d", nextNo);
        }
        // 查询当前用户所在组织部门下的最大编码，在此基础上加一
        String orgNoMax = baseMapper.selectMaxUnderOrgNo(parentOrgNo);
        if (StrUtil.isEmpty(orgNoMax)) {
            return parentOrgNo + "001";
        }
        int integer = Integer.parseInt(orgNoMax);
        if (integer == 999) {
            throw new BusinessException("组织编码耗尽，请联系管理员处理");
        }
        return String.format("%03d", integer + 1);
    }
}




